home *** CD-ROM | disk | FTP | other *** search
- /*
- **【 作品名 】 TIFFSMT
- **【 版 数 】 V1.0 L10
- **【 作 者 】 WAVE Soft
- **【 日 付 】 1993.2.7
- ** 1993.2.21 修正
- **
- **【 説 明 】 ソフトウェア種別:画像処理ソフト(フィルター)
- ** ビデオカードからデジタイズした画像の画像処理を行います。
- ** 処理は、各ドットの回りにあるドットを調べて、平滑化しています。
- **
- ** 使い方はコンソールから
- **
- ** run386 tiffsmt.exp -l level -o outfile.tif infile
- ** level: 1 から 93 までの数字を指定する
- ** outfile: 処理した画像を保存するファイル名
- ** infile: デジタイズした画像のファイル
- **
- ** (C) 1993 WAVE Soft
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <DOS.h> /* _FP_SEG(), _FP_OFF() */
- #include <egb.h>
-
- #define PROTO
- #define CLEAR_CODE 256
- #define EOF_CODE 257
- #define MAXTABLE 4096
-
- char gwork[EgbWorkSize];
-
- typedef struct {
- char *fname; /* 画像の名前 */
- short xsize ; /* 横のドット数 */
- short ysize ; /* 縦のドット数 */
- short bpixel; /* ピクセルのドット数 1:2 4:16 8:256 16:32768 色を示す。 */
- char comprs; /* 圧縮の状態 1:無 5:LZW */
- char phintp; /* 0:モノクロ 1:カラー 3:パレット */
- short imgoff; /* 画像データへのoffset */
- short pltoff; /* パレットデータへのoffset 0:パレット未使用 */
- long ibyte ; /* 画像データのバイト数 */
- } tiff_tag;
- tiff_tag t;
-
- unsigned short awork[240][320]; /* 画像データ */
- unsigned char fwork[0x200]; /* TAG データ */
-
- int main(int argc, char *argv[])
- {
- const char *inpfile="";
- const char *outfile="tiffsmt.tif";
- int level=16,count=1;
- char para[64];
- int ret,i;
-
- if(argc==1)
- {printf("option: [-l level] [-c count] [-o outfile] infilename\n");
- puts(" level = 0 ` 93(defaut:16)");
- puts(" outfile = save するファイル名(default:tiffsmt.tif)");
- puts(" infilename = 処理するファイル名 '.tif' にしてね");
- puts(" 320*240 の 32K色の画像が対象です。");
- return 1;
- }
-
- for(i=1; i<argc; i++)
- {
- if(strcmp(argv[i],"-l")==0) {i++;level=atoi(argv[i]);}
- else if(strcmp(argv[i],"-c")==0) {i++;count=atoi(argv[i]);}
- else if(strcmp(argv[i],"-o")==0) {i++;outfile=argv[i];}
- else inpfile=argv[i];
- }
-
- if( (ret=load_tiff(inpfile,awork))== -1 )
- {printf("%s がロードできんかった。\n",inpfile);return ret;}
- if( ret== -2 )
- {printf("このTIFF 形式 のヘッダは扱えないよ。\n");return ret;}
- if( ret== -3 )
- {printf("このTIFF 形式 ファイルは扱えないよ。\n");
- printf("ファイル名: %s のデータ\n",t.fname);
- printf("横のドット数 = %d\n",t.xsize);
- printf("縦のドット数 = %d\n",t.ysize);
- printf("ピクセルのドット数(1:2 4:16 8:256 16:32768) = %d\n",t.bpixel);
- printf("圧縮の状態(1:無 5:LZW ) = %d\n",t.comprs);
- printf("画像の種類(0:モノクロ 1:カラー 3:パレット) = %d\n",t.phintp);
- return ret;}
-
- set_screen();
- DWORD(para )=(unsigned int)awork;
- WORD(para+ 4)=0x14;
- WORD(para+ 6)=0;
- WORD(para+ 8)=0;
- WORD(para+10)=t.xsize-1;
- WORD(para+12)=t.ysize-1;
- EGB_putBlock(gwork,0,para);
-
- for(i=0;i<count;i++)
- { char para[64];
- DWORD(para )=(unsigned int)awork;
- WORD(para+ 4)=0x14;
- WORD(para+ 6)=0;
- WORD(para+ 8)=0;
- WORD(para+10)=t.xsize-1;
- WORD(para+12)=t.ysize-1;
- EGB_getBlock(gwork,para);
- flat(level);
- }
- { char para[64];
- DWORD(para )=(unsigned int)awork;
- WORD(para+ 4)=0x14;
- WORD(para+ 6)=0;
- WORD(para+ 8)=0;
- WORD(para+10)=t.xsize-1;
- WORD(para+12)=t.ysize-1;
- EGB_getBlock(gwork,para);
- }
-
- if( (ret=save_tiff(outfile,awork))!=0 )
- {printf("ファイル %s への書き込みができませんでした。\n",outfile);
- return ret;}
-
- return 0;
- }
-
- int flat(int level)
- {
- _far unsigned short *vram1;
- int i,j;
-
- #define COLSP(x,g,r,b) { b=x & 0x001f; r=(x & 0x03e0)>>5; g=x>>10;}
- #define COLCN(x,g,r,b) { x = b | (r<<5) | (g<<10); }
- #define COLDF(g1,r1,b1,g2,r2,b2) ( _abs((g2)-(g1))+_abs((r2)-(r1))+_abs((b2)-(b1)))
-
- _FP_SEG( vram1 ) = 0x104; /* 又は 0x10c */
- _FP_OFF( vram1 ) = 256*1024;
-
- for( j=1; j<239; j++)
- for(i=1; i<319; i++)
- {
- int k,n,av,ag,ar,ab, g[9],r[9],b[9];
-
- av=awork[j][i]; COLSP( av, ag, ar, ab);
- av=awork[j-1][i-1]; COLSP( av, g[0], r[0], b[0]);
- av=awork[j-1][i ]; COLSP( av, g[1], r[1], b[1]);
- av=awork[j-1][i+1]; COLSP( av, g[2], r[2], b[2]);
- av=awork[j ][i-1]; COLSP( av, g[3], r[3], b[3]);
- av=awork[j ][i ]; COLSP( av, g[8], r[8], b[8]);
- av=awork[j ][i+1]; COLSP( av, g[4], r[4], b[4]);
- av=awork[j+1][i-1]; COLSP( av, g[5], r[5], b[5]);
- av=awork[j+1][i ]; COLSP( av, g[6], r[6], b[6]);
- av=awork[j+1][i+1]; COLSP( av, g[7], r[7], b[7]);
- for(n=1,k=0;k<8;k++)
- {
- if( COLDF( g[8],r[8],b[8],g[k],r[k],b[k] ) <= level )
- {ag+=g[k];ar+=r[k];ab+=b[k];n++;}
- }
- ag/=n;ar/=n;ab/=n;
- COLCN( av, ag, ar, ab);
- /* awork[j][i]=vram1[j*512+i]=av ; */
- vram1[j*512+i]=av ;
- }
-
- return 0;
- }
-
- int set_screen()
- {
-
- EGB_init(gwork,EgbWorkSize); /* 画面初期化 */
- EGB_resolution(gwork,0,3); /* page=0;mode */
- EGB_writePage(gwork,0);
- EGB_displayStart(gwork,0,0,0); /* 表示開始位置 (0,0) */
- EGB_displayStart(gwork,1,0,0); /* 仮想画面の表示位置 */
- EGB_displayStart(gwork,2,1,1); /* 拡大 */
- EGB_displayStart(gwork,3,640,480); /* 画面のサイズ */
- EGB_resolution(gwork,1,10); /* page=1;mode */
- EGB_writePage(gwork,1);
- EGB_displayStart(gwork,0,0,0); /* 表示開始位置 (0,0) */
- EGB_displayStart(gwork,1,0,0); /* 仮想画面の表示位置 */
- EGB_displayStart(gwork,2,2,2); /* 拡大 */
- EGB_displayStart(gwork,3,320,240); /* 画面のサイズ */
- EGB_displayPage(gwork,0,3); /* page0 前 page1,2表示 */
-
- return 0;
- }
-
- int load_tiff( const char *fname, char *awork)
- {
- int ret;
-
- t.fname=(char *)fname;
- if( (ret=tiff_getattr(&t) )!=0 ) return ret;
- if( (ret=tiff_getimg( &t, (char *)awork))!=0 ) return ret;
- if( t.bpixel!=16 ) return -3;
- if( t.xsize >320 ) return -3;
- if( t.ysize >240 ) return -3;
- return 0;
- }
-
- /**/
- PROTO int tiff_getattr( tiff_tag *t )
- /*
- * fname = ファイルネーム(拡張子も付ける)
- * xsize = 横のドット数
- * ysize = 縦のドット数
- * bpixel= ピクセルのドット数 1:2 4:16 8:256 16:32768 色を示す。
- * comprs= 圧縮の状態 1:無 5:LZW
- * phintp= 0:モノクロ 1:カラー 3:パレット
- * imgoff= 画像データへのoffset
- * pltoff= パレットデータへのoffset 0:パレット未使用
- * ibyte = 画像データのバイト数
- */
- {
- FILE *fp;
- int i;
-
- if((fp=fopen(t->fname, "rb"))==NULL) return -1;
- if(fread( fwork, 1,0x200,fp) != 0x200) {fclose(fp); return -1;}
- t->xsize= t->ysize= t->bpixel= t->comprs= t->imgoff= t->pltoff= t->ibyte=0;
- if(fclose(fp)) return -1;
- if( strncmp( (const char*)fwork,"\x49\x49\x2a\x00\x08\x00\x00\x00",8)!=0)
- return -2;
-
- for(i=0; i< WORD(fwork+8); i++)
- switch(WORD(fwork+0xa+i*12))
- {
- case 0x0100: t->xsize =(short) DWORD(fwork+0x12+i*12); break;
- case 0x0101: t->ysize =(short) DWORD(fwork+0x12+i*12); break;
- case 0x0102: t->bpixel=(short) DWORD(fwork+0x12+i*12); break;
- case 0x0103: t->comprs=(char) DWORD(fwork+0x12+i*12); break;
- case 0x0106: t->phintp=(char) DWORD(fwork+0x12+i*12); break;
- case 0x0111: t->imgoff=(short) DWORD(fwork+0x12+i*12); break;
- case 0x0117: t->ibyte =(long) DWORD(fwork+0x12+i*12); break;
- case 0x0140: t->pltoff=(short) DWORD(fwork+0x12+i*12); break;
- };
- if( (t->bpixel != 16) || (t->phintp != 1) ) return -3;
- if( (t->comprs != 1) && (t->comprs != 5) ) return -3;
- return 0;
- }
-
- /**/
- PROTO int tiff_getimg( tiff_tag *t, char *ibuf)
- {
- FILE *fp;
- int datasz;
- if((fp=fopen(t->fname, "rb"))==NULL) return -1;
- if(fseek(fp,t->imgoff,SEEK_SET)) {fclose(fp); return -1;}
- datasz=fread( ibuf, 1, 240*320*2,fp);
- if(fclose(fp)) return -1;
- if( t->comprs == 5)
- { char *mv;
- t->comprs = 1;
- mv=ibuf+(320*240*2-datasz);
- _rmemcpy(mv,ibuf,datasz);
- tiff_uncmp2( ibuf, (const char *)mv, datasz);
- }
- t->ibyte = t->xsize * t->ysize*2;
- return 0;
- }
-
- /**/
- PROTO int save_tiff(const char *savefile, char *awork)
- {
- FILE *fp;
- int i;
-
- for(i=0; i< WORD(fwork+8); i++)
- switch(WORD(fwork+0xa+i*12))
- {
- case 0x0103: DWORD(fwork+0x12+i*12)=1 ; break;
- case 0x0117: DWORD(fwork+0x12+i*12)=t.xsize*t.ysize*2 ; break;
- };
- if((fp=fopen(savefile, "wb"))==NULL) return -1;
- if(fwrite( fwork,1, 0x200,fp) != 0x200 ) {fclose(fp);return -1;}
- if(fwrite( awork,1, t.ibyte,fp) != t.ibyte ) {fclose(fp);return -1;}
- if(fclose(fp)) return -1;
- return 0;
- }
-
- /**/
- /* LZW 圧縮されたデータを展開する */
- /* 1992-2 OH! FM TOWNS p.75 を参考にした */
- /* expand :展開する領域の先頭アドレス */
- /* indata :圧縮されたデータ */
- /* 戻り値 :展開したバイト数 エラーのときは 0 */
- /* 使用メモリー : stack 33K bytes */
- PROTO int tiff_uncmp2( char *expand, const char *indata, int insize)
- {
- struct { char *s,*e; } table[MAXTABLE];
- char chrd[256];
- char *outdata;
- int cbl,btp,table_ix;
- unsigned int code;
- int i;
- btp=0; outdata= expand;
- for(i=0;i<256;i++) {chrd[i]=i;table[i].s=table[i].e=&chrd[i];}
- table_ix=EOF_CODE+1;
- cbl=9;i=0;
- while( i++ < insize ) {
- /* ret = ((indata[0]*256+indata[1])*256+indata[2])*256 ; */
- code = ((((indata[0]<<8) | indata[1])<<8) | indata[2])<<8 ;
- code = code << btp ;
- code = code >> (32-cbl) ;
- btp=cbl-(8-btp); indata++;
- while( btp >= 8 ) {indata++; btp-=8;}
- if( code == EOF_CODE ) {
- break;
- } else if( code == CLEAR_CODE ) { /* クリアコード */
- table_ix=EOF_CODE+1;
- cbl=9;
- } else if( code < table_ix ) { /* テーブルに存在 */
- register char *p;
- table[table_ix].s=outdata;
- for( p=table[code].s; p<=table[code].e; *outdata++=*p++);
- table[table_ix++].e=outdata;
- if(table_ix==(1<<cbl)) {cbl++; if(cbl>=13) cbl=12;}
- } else {
- return 0;
- }
- }
- return (int) (outdata-expand);
- }
-